package br.org.bertol.mestrado;

import java.io.File;
import java.io.IOException;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.log4j.Logger;

import br.org.bertol.mestrado.engine.RandomSolution;
import br.org.bertol.mestrado.engine.exception.HeuristicsException;
import br.org.bertol.mestrado.util.Configurator;

/**
 * @author contaqualquer
 */
public class Buscador {

    /**
     * Gerador de soluções iniciais randômicas.
     */
    public static RandomSolution randomSolution;

    private Configurator         configurator;

    public Buscador() throws ConfigurationException {

        final String init = System.getProperty("moo");

        configurator = new Configurator(init);
    }

    public static void main(final String[] args) {
        try {
            final long iniTime = System.currentTimeMillis();

            final Buscador buscador = new Buscador();

            randomSolution = new RandomSolution();

            // limpa diret�rios de sa�da
            buscador.startOutPut();

            buscador.starSystem();

            Logger
                    .getLogger(Buscador.class)
                    .info(
                          "Processamento encerrado. Tempo total: "
                    + (float) ((System.currentTimeMillis() - iniTime) / 60000)
                    + " minutos.");
        } catch (ConfigurationException e) {

            Logger.getLogger(Buscador.class).error("Erro", e);

            System.exit(-1);
        } catch (HeuristicsException e) {
            Logger.getLogger(Buscador.class).error("Erro", e);

            System.exit(-2);
        } catch (InterruptedException e) {
            Logger.getLogger(Buscador.class).error("Erro", e);

            System.exit(-3);
            e.printStackTrace();
        } catch (IOException e) {
            Logger.getLogger(Buscador.class).error("Erro", e);

            System.exit(-4);
        }
    }

    public final void starSystem() throws HeuristicsException,
            InterruptedException, IOException {
        final AbstractStarter<?>[] starters = configurator.getEngineStarters();

        for (int c = 0; c < configurator.getNumRestarts(); c++) {

            for (AbstractStarter<?> starter : starters) {
                starter.startEngine();
            }
        }

        for (AbstractStarter<?> starter : starters) {
            starter.save();
        }
    }

    /**
     * Inicia os diretórios onde serão armazenados as saídas.
     */
    private void startOutPut() {
        final String[] systems = configurator.getSystems();

        final String sourcePath = configurator.getSourcePath();

        for (String system : systems) {

            Logger.getLogger(this.getClass()).debug(
                                                    "Encontrado sistema "
                    + system);

            final File diretorio = new File(sourcePath + "/" + system);

            diretorio.mkdir();

            // deleta os arquivos exsistentes
            for (File temp : diretorio.listFiles()) {
                temp.delete();
            }
        }

        // limpa arquivo final
        final File diretorio = new File(sourcePath + "/resultado");

        diretorio.mkdir();

        // deleta os arquivos exsistentes
        for (File temp : diretorio.listFiles()) {
            temp.delete();
        }
    }

}
